{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "LENGTH = 1000  # 每一个样本由1000个\n",
    "\n",
    "def sample_data(size, length=100):\n",
    "    \"\"\"\n",
    "    生成值得均值和方差的数据\n",
    "    :param size:\n",
    "    :param length:\n",
    "    :return:\n",
    "    \"\"\"\n",
    "    data = []\n",
    "    for _ in range(size):\n",
    "        data.append(sorted(np.random.normal(4, 1.5, length)))\n",
    "    return np.array(data)\n",
    "\n",
    "\n",
    "def random_data(size, length=100):\n",
    "    \"\"\"\n",
    "    随机生成数据\n",
    "    :param size:\n",
    "    :param length:\n",
    "    :return:\n",
    "    \"\"\"\n",
    "    data = []\n",
    "    for _ in range(size):\n",
    "        x = np.random.random(length) \n",
    "        data.append(x)\n",
    "    return np.array(data)\n",
    "\n",
    "\n",
    "def preprocess_data(x):\n",
    "    \"\"\"\n",
    "    计算每一组数据平均值和方差\n",
    "    :param x:\n",
    "    :return:\n",
    "    \"\"\"\n",
    "    return [[np.mean(data), np.std(data)] for data in x]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder(tf.float32, shape=[None, 2], name=\"feature\")  # [mean，std] -》 D\n",
    "y = tf.placeholder(tf.float32, shape=[None, 1], name=\"label\")\n",
    "in_size = LENGTH\n",
    "out_size = LENGTH\n",
    "\n",
    "###################################### G  网络结构\n",
    "# 第一层\n",
    "z = tf.placeholder(tf.float32, shape=[None, LENGTH], name=\"noise\")  # 随机值噪音\n",
    "Weights = tf.Variable(tf.random_normal([in_size, 32]))\n",
    "biases = tf.Variable(tf.zeros([1, 32]) + 0.1)\n",
    "G_output = tf.matmul(z, Weights) + biases\n",
    "G_output = tf.nn.relu(G_output)\n",
    "# 第二层\n",
    "Weights2 = tf.Variable(tf.random_normal([32, 32]))\n",
    "biases2 = tf.Variable(tf.zeros([1, 32]) + 0.1)\n",
    "G_output2 = tf.matmul(G_output, Weights2) + biases2\n",
    "G_output2 = tf.nn.sigmoid(G_output2)\n",
    "# 第三层\n",
    "Weights3 = tf.Variable(tf.random_normal([32, out_size]))\n",
    "biases3 = tf.Variable(tf.zeros([1, out_size]) + 0.1)\n",
    "G_output3 = tf.matmul(G_output2, Weights3) + biases3\n",
    "\n",
    "G_PARAMS = [Weights, biases, Weights2, biases2, Weights3, biases3]  # G的参数\n",
    "\n",
    "###################################### D 网络结构(预训练的D)\n",
    "# 第一层\n",
    "\n",
    "dWeights = tf.Variable(tf.random_normal([2, 32]), name=\"D_W\")\n",
    "dbiases = tf.Variable(tf.zeros([1, 32]) + 0.1, name=\"D_b\")\n",
    "D_output = tf.matmul(x, dWeights) + dbiases\n",
    "D_output = tf.nn.relu(D_output)\n",
    "# 第二层\n",
    "dWeights2 = tf.Variable(tf.random_normal([32, 32]), name=\"D_W2\")\n",
    "dbiases2 = tf.Variable(tf.zeros([1, 32]) + 0.1, name=\"D_b2\")\n",
    "D_output2 = tf.matmul(D_output, dWeights2) + dbiases2\n",
    "D_output2 = tf.nn.sigmoid(D_output2)\n",
    "\n",
    "# 第三层\n",
    "dWeights3 = tf.Variable(tf.random_normal([32, 1]), name=\"D_W3\")\n",
    "dbiases3 = tf.Variable(tf.zeros([1, 1]) + 0.1, name=\"D_b3\")\n",
    "D_output3_ = tf.matmul(D_output2, dWeights3) + dbiases3\n",
    "D_output3 = tf.nn.sigmoid(D_output3_)\n",
    "\n",
    "D_PARAMS = [dWeights, dbiases,\n",
    "            dWeights2, dbiases2,\n",
    "            dWeights3, dbiases3]\n",
    "\n",
    "##################################### GAN的结构\n",
    "\n",
    "# 先求出G_output3的各行平均值和方差\n",
    "MEAN = tf.reduce_mean(G_output3, 1)  # 行向量\n",
    "MEAN_T = tf.transpose(tf.expand_dims(MEAN, 0))  # 转置\n",
    "STD = tf.sqrt(tf.reduce_mean(tf.square(G_output3 - MEAN_T), 1))\n",
    "DATA = tf.concat(1, [MEAN_T,\n",
    "                     tf.transpose(tf.expand_dims(STD, 0))])\n",
    "\n",
    "# GAN中的D\n",
    "GAN_Weights = tf.Variable(tf.random_normal([2, 32]), name=\"GAN_W\")\n",
    "GAN_biases = tf.Variable(tf.zeros([1, 32]) + 0.1, name=\"GAN_b\")\n",
    "GAN_output = tf.matmul(DATA, GAN_Weights) + GAN_biases\n",
    "GAN_output = tf.nn.relu(GAN_output)\n",
    "# 第二层\n",
    "GAN_Weights2 = tf.Variable(tf.random_normal([32, 32]), name=\"GAN_W2\")\n",
    "GAN_biases2 = tf.Variable(tf.zeros([1, 32]) + 0.1, name=\"GAN_b2\")\n",
    "GAN_output2 = tf.matmul(GAN_output, GAN_Weights2) + GAN_biases2\n",
    "GAN_output2 = tf.nn.sigmoid(GAN_output2)\n",
    "\n",
    "# 第三层\n",
    "GAN_Weights3 = tf.Variable(tf.random_normal([32, 1]), name=\"GAN_W3\")\n",
    "GAN_biases3 = tf.Variable(tf.zeros([1, 1]) + 0.1, name=\"GAN_b3\")\n",
    "GAN_output3_ = tf.matmul(GAN_output2, GAN_Weights3) + GAN_biases3\n",
    "GAN_output3 = tf.nn.sigmoid(GAN_output3_)\n",
    "\n",
    "GAN_D_PARAMS = [GAN_Weights, GAN_biases,\n",
    "                GAN_Weights2, GAN_biases2,\n",
    "                GAN_Weights3, GAN_biases3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "##################################### 定义损失函数\n",
    "d_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(D_output3_, y))  # 二分类交叉熵\n",
    "g_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(GAN_output3_, y))  # GAN二分类交叉熵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#################################### 定义优化器\n",
    "d_optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(\n",
    "    d_loss,\n",
    "    global_step=tf.Variable(0),\n",
    "    var_list=D_PARAMS\n",
    ")\n",
    "\n",
    "g_optimizer = tf.train.GradientDescentOptimizer(0.05).minimize(\n",
    "    g_loss,\n",
    "    global_step=tf.Variable(0),\n",
    "    var_list=G_PARAMS\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "d_loss_history = []\n",
    "g_loss_history = []\n",
    "epoch = 200\n",
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    # GAN博弈开始\n",
    "    print('train GAN....')\n",
    "    for step in range(epoch):\n",
    "        # 先进行GAN中的D的训练，即对生成样本的判断\n",
    "        for _ in range(100):\n",
    "            # 使用G生成一批样本:\n",
    "            real = sample_data(100,length=LENGTH)\n",
    "            noise = random_data(100,length=LENGTH)\n",
    "            generate = sess.run(G_output3, feed_dict={\n",
    "                z: noise\n",
    "            })  # 生成样本\n",
    "            X = list(real) + list(generate)  \n",
    "            X = preprocess_data(X)\n",
    "            Y = [[1] for _ in range(len(real))] + [[0] for _ in range(len(generate))]\n",
    "            d_loss_value, _ = sess.run([d_loss, d_optimizer], feed_dict={\n",
    "                x: X,\n",
    "                y: Y\n",
    "            })  # 训练判别网络\n",
    "            d_loss_history.append(d_loss_value)\n",
    "        # 将参数移动过去GAN中的判别网络\n",
    "        dp_value = sess.run(D_PARAMS)\n",
    "        for i, v in enumerate(GAN_D_PARAMS):\n",
    "            sess.run(v.assign(dp_value[i]))\n",
    "\n",
    "        for _ in range(100):\n",
    "            noise = random_data(100,length=LENGTH)\n",
    "            g_loss_value, _ = sess.run([g_loss, g_optimizer], feed_dict={\n",
    "                z: noise,\n",
    "                y: [[1] for _ in range(len(noise))]  # 混肴为目标,不需要加入x，我们只是借助G，并不需要训练G\n",
    "            })  # 调整G，让GAN的误差减少\n",
    "            g_loss_history.append(g_loss_value)\n",
    "        if step % 20 == 0 or step+1 == epoch:\n",
    "            noise = random_data(1,length=LENGTH)\n",
    "            generate = sess.run(G_output3, feed_dict={\n",
    "                z: noise\n",
    "            })\n",
    "            print(\"[%4d] GAN-d-loss: %.12f  GAN-g-loss: %.12f   generate-mean: %.4f   generate-std: %.4f\" % (step,\n",
    "                            d_loss_value, g_loss_value,generate.mean() ,generate.std() ))\n",
    "            \n",
    "            \n",
    "    print(\"train finish...\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1fe165ff28>]"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1fe15bd4a8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.subplot(211)\n",
    "plt.plot(d_loss_history)\n",
    "a = plt.subplot(212)\n",
    "plt.plot(g_loss_history,c=\"g\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1fe16e8a20>]"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1fe15dbd30>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "real = sample_data(1,length=LENGTH)\n",
    "(data, bins) = np.histogram(real[0])\n",
    "plt.plot(bins[:-1], data, c=\"g\")\n",
    "\n",
    "\n",
    "(data, bins) = np.histogram(noise[0])\n",
    "plt.plot(bins[:-1], data, c=\"b\")\n",
    "\n",
    "# with tf.Session() as sess:\n",
    "#     sess.run(tf.global_variables_initializer())\n",
    "#     generate = sess.run(G_output3, feed_dict={\n",
    "#             z: noise\n",
    "#     })\n",
    "(data, bins) = np.histogram(generate[0])\n",
    "plt.plot(bins[:-1], data, c=\"r\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.31326169,  0.69314718])"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#x - x * z + log(1 + exp(-x))\n",
    "\n",
    "pre = np.array([1,0])\n",
    "real = np.array([0,1])\n",
    "\n",
    "pre-pre*real + np.log(1+np.exp(-pre))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    ""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    ""
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3.0
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}